home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / objects in c ƒ / OIC Sources / oic.h < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-01  |  4.2 KB  |  126 lines  |  [TEXT/KAHL]

  1. /*
  2.  *    OIC structure definitions
  3.  *
  4.  *            Copyright © John Wainwright 1988
  5.  */
  6.  
  7. #define IVs(obj,class,structure) ((structure *)(&((char *)(obj))[ClassOf(obj)->c_ivoffsets[class->c_index]]))
  8. #define myIVs(class,structure)    ((structure *)(&((char *)(self))[ClassOf(self)->c_ivoffsets[class->c_index]]))
  9. #define localIVs(obj,structure) ((structure *)(&((char *)(obj))[ClassOf(obj)->c_ivoffsets[currentClass->c_index]]))
  10. #define CVs(obj,class,structure) ((structure *)(&((char *)((*obj)->c_classvars))[(*obj)->c_cvoffsets[class->c_index]]))
  11. #define myCVs(class,structure)    ((structure *)(&((char *)((*self)->c_classvars))[(*self)->c_cvoffsets[class->c_index]]))
  12. #define localCVs(obj,structure) ((structure *)(&((char *)(*obj)->c_classvars)[(*self)->c_cvoffsets[currentClass->c_index]]))
  13.  
  14. #define    talloc(t)    (t *)scalloc(sizeof(t))
  15. #define abs(x)        (((x) < 0) ? (-(x)) : (x))
  16. #ifndef NULL
  17.     #define NULL    0L
  18. #endif
  19. #define ClassOf(x)    ((class)*(x))
  20.  
  21. typedef struct class_struct    *class;
  22. typedef struct class_struct    **object;
  23. typedef struct classlist    classlist;        /* super class list                     */
  24. typedef struct GenericTable    GenericTable;    /* generic function method table     */
  25. typedef GenericTable        *generic;        /* useful definition for generic    */
  26. typedef struct MethTable    MethTable;        /* method table                        */
  27. typedef struct Method        Method;            /* method table function entry        */
  28. typedef char *                keyword_args;    /* for the keyword argument system    */
  29.  
  30. struct classlist
  31. {
  32.     classlist   *cl_next;                /* next class in list            */
  33.     class          cl_class;                /* -> class structure            */
  34. };
  35.  
  36. struct class_struct
  37. {
  38.     class          c_classtag;                /* class class                    */
  39.     class          c_next;                    /* class list link                */
  40.     char        *c_name;                /* class name for debugging        */
  41.     int            c_flags;                /* flags                        */
  42.     int            c_lclivsize;            /* local iv struct size            */
  43.     int            c_lclcvsize;            /* local cv struct size            */
  44.     int            c_ivsize;                /* total IVs size                */
  45.     int            c_cvsize;                /* total CVs size                */
  46.     int            c_allocz;                /* total object size            */
  47.     int            c_index;                /* class index into method/offset tables */
  48.     int            *c_ivoffsets;            /* IV offset table                */
  49.     int            *c_cvoffsets;            /* CV offset table                */
  50.     char        *c_classvars;            /* class vars block (if any)    */
  51.     classlist   *c_superclasses;        /* superclass list                */
  52. };
  53.  
  54. #define C_HASCLASSMETHODS    1            /* class methods defined.  c_flags fields... */
  55.  
  56. extern char        *salloc();
  57. extern char        *scalloc();
  58. extern char        *srealloc();
  59.  
  60. extern class      NewClass();
  61. extern class      currentClass;
  62. extern GenericTable* currentGeneric;
  63. extern class      classes;
  64. extern object    namedObjects;
  65. extern GenericTable    *generics;
  66. extern object    New();
  67. extern object    Dispatch();
  68. extern object    ClassDispatch();
  69. extern object    ApplyGeneric();
  70. extern object    Super();
  71. extern object    SuperFrom();
  72. extern object    SuperPassArgs();
  73. extern int        SizeOf();
  74. extern char     *ClassNameOf();
  75. extern char        *GenericName();
  76. extern int        IsAKindOf();
  77. extern int        IsA();
  78. extern int        IsObj();
  79. extern object    key_arg();
  80.  
  81. #define CLASS        1                    /* index of class method table    */
  82. #define    END            0L
  83. #define UNLINKED    (GenericTable *)1L    /* initial value for generic table links    */
  84. #define method        static                /* syntactic sugar for method declarations    */
  85.  
  86. struct Method                            /* method function table entry    */
  87. {
  88.     object    (*mf_func)();                /* method function                */
  89.     class      mf_from;                    /* class from which inherited     */
  90. };
  91.  
  92. struct MethTable
  93. {
  94.     int            mth_minClass;        /* lowest class index            */
  95.     int            mth_maxClass;        /* highest class index            */
  96.     Method        *mth_meths;            /* table of method functions    */
  97. };
  98.     
  99. struct GenericTable
  100. {
  101.     GenericTable *gen_next;                /* linked list of generics        */
  102.     object        (*gen_generic)();        /* pointer to my generic        */
  103.     char        *gen_name;                /* generic function name        */
  104.     MethTable     gen_mtables[2];            /* method tables inst. & class    */
  105. };
  106.  
  107. #define defGeneric(gen, genTable, name)                        \
  108.     GenericTable genTable[1] =                                \
  109.     {                                                        \
  110.         UNLINKED, &gen, name                                \
  111.     };                                                        \
  112.     object                                                    \
  113.     gen(obj, args)                                            \
  114.         object     obj;                                        \
  115.         char    *args;                                        \
  116.     {                                                          \
  117.         return                                                \
  118.             (ClassOf(obj) == Class)    ?                        \
  119.                 ClassDispatch(&genTable, obj, &args)        \
  120.             :                                                \
  121.                 Dispatch(&genTable, obj, &args);            \
  122.     }
  123.  
  124. #define externGeneric(gen, genTable)                         \
  125.     extern GenericTable     genTable[1];                    \
  126.     extern object            gen();